from lxml import etree
from urllib import request

"""
需求分析
    工作名称,对应地址,公司名称,薪资待遇(如果没有则写面议)
    工作地点,经验要求,学历要求
存储位置:
    存储紧mysql数据库中,分类整理好
"""
# 连接mysql数据库,经查询到的数据保存进来
import MySQLdb

conn = MySQLdb.connect(
    host="localhost",  # mysql所在的主机的ip
    port=3306,  # mysql的端口号
    user="root",  # mysql的用户名
    password="123456",  # mysql的密码
    db="reptiles",  # 要使用的库名
    charset="utf8",  # 连接中使用的字符集
)
cursor = conn.cursor(MySQLdb.cursors.DictCursor)  # 获取游标对象,里面可以为空,这样写是为了显示全面的信息

url = "https://m.51job.com/search/joblist.php?keyword=web%E5%89%8D%E7%AB%AF&keywordtype=2&funtype=0000&indtype=00&jobarea=010000&jobterm=99&cotype=99&issuedate=9&saltype=99&degree=99&landmark=0&workyear=99&cosize=99&radius=-1&lonlat=0%2C0"

res = request.urlopen(url).read()
# 这个文件不需要解压缩,直接解码就行
data = res.decode("utf-8")  # 解码

# 编译为element对象进行图像的获取操作
ele = etree.HTML(data)

# 获取首页所有数据的地址
job_urls = ele.xpath("//div[@class='items']/a/@href")

'''
# 此时需要注意的是,我们再当前页面只获取连接url即可,
# 其他的数据不用获取,容易出问题,在新的页面里面再获取
不容易出现问题(名字多个标签拼接的情况就不会出现)
'''
# 遍历所有连接url数据,编写一个函数,
def fun(job_urls):
    for job_url in job_urls:
        # 对于新的url,再次发送请求即可获取到本页的数据
        res = request.urlopen(job_url).read().decode("utf-8")
        # 编译为element对象,使用xpath获取想要的信息
        ele = etree.HTML(res)

        # 获取首页所有数据岗位对应的薪资
        job_salary = ele.xpath("//p[@class='jp']/text()")
        job_salary = ("".join(job_salary))

        # 获取首页所有公司对应的工作地点
        job_workplace = ele.xpath("//div[@class='jt']/em/text()")
        job_workplace = (''.join(job_workplace))    # 将列表转为字符串

        # 获取名称信息
        job_name = ele.xpath("//div[@class='jt']/p/text()")
        job_name = ("".join(job_name))

        # 获取首页所有信息的经验要求
        job_expire = ele.xpath("//span[@class='s_n']/text()")
        job_expire = ("".join(job_expire))

        # 获取首页所有信息的学历要求
        job_education = ele.xpath("//span[@class='s_x']/text()")
        job_education = ("".join(job_education))

        # 获取首页所有信息的招聘岗位所需要的人数
        job_number = ele.xpath("//span[@class='s_r']/text()")
        job_number = ("".join(job_number))

        # 获取发布时间
        release_time = ele.xpath("//div[@class='jt']/span/text()")
        release_time = ("".join(release_time))

        # 获取首页所有数据的公司名称
        company_name = ele.xpath("//p[@class='c_444']/text()")
        company_name = ("".join(company_name))

        # 获取公司类别,人数,行业信息
        company_number = ele.xpath("//div[@class='at']/text()")
        company_number = ("".join(company_number))

        # 获取首页所有信息的上班地址
        work_address = ele.xpath("//a[@class='arr a2']/span/text()")
        work_address = ("".join(work_address))

        # 获取首页所有信息的职位描述(此信息还需要进一步优化)
        job_describe = ele.xpath("//article/p/text()")
        job_describe = ("".join(job_describe))

        # 此时已经获取到了我们所需要的数据,下面我们将数据入库
        list = [job_salary,job_workplace,job_name,job_expire,job_education,job_number,company_name,company_number,work_address,job_describe]
        sql = "insert into 51job(job_salary,job_workplace,job_name,job_expire,job_education,job_number,company_name,company_number,work_address,job_describe) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
        res = cursor.execute(sql, list)
        conn.commit()
    cursor.close()
    conn.close()

#引用此函数
fun(job_urls)

"""
插入数据时需要字符串才能插,还要注意字段和爬取的数据有没有出入的地方,不确定的就写varcha()就行
缺点:保存的数据没有处理
"""
